package com.diandiji.demo.exception;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;

/**
 * 全局异常处理器，用于捕获并处理各种异常。
 * 通过该类，可以统一返回错误响应，提升用户体验。
 */
@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 处理认证失败错误（IllegalArgumentException）。
     * 当拦截器中抛出 IllegalArgumentException 时，返回 401 Unauthorized 状态码。
     *
     * @param ex 捕获到的异常对象
     * @return 包含错误信息的 HTTP 响应
     */
    @ExceptionHandler(IllegalArgumentException.class)
    public ResponseEntity<String> handleAuthError(IllegalArgumentException ex) {
        return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(ex.getMessage());
    }

    /**
     * 处理空指针异常（NullPointerException）。
     * 当代码中出现空指针异常时，返回 500 Internal Server Error 状态码。
     *
     * @param ex 捕获到的异常对象
     * @return 包含错误信息的 HTTP 响应
     */
    @ExceptionHandler(NullPointerException.class)
    public ResponseEntity<String> handleNullPointer(NullPointerException ex) {
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("服务器内部错误：缺少必要参数");
    }

    //处理参数类型不匹配异常，避免返回误导性401状态码。
    @ExceptionHandler(MethodArgumentTypeMismatchException.class)
    public ResponseEntity<String> handleTypeMismatch(MethodArgumentTypeMismatchException ex) {
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("参数类型错误: " + ex.getName());
    }

    @ExceptionHandler(NumberFormatException.class)
    public ResponseEntity<String> handleNumberFormat(NumberFormatException ex) {
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body("参数格式错误: 需要数字类型");
    }
}